﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Imaginecup.util.resourceMan;
using Imaginecup.sprite.particle;
using Imaginecup.sprite;
using imaginecup.util;

namespace Imaginecup.util
{
    public enum ParticleType{Rain , TouchEffect}

    public class Particle:IColorClass
    {
                
        private Vector2 m_CurrentPos; // 입자의 위치
        private Vector2 m_Size; // 입자의 크기.
        private Vector2 m_Dir; // 입자의 방향
        private double m_Velocity; //입자속도
        private double m_ExistTime; // 입자가 존재하는 시간
        private Color m_Color;        // 입자의 색깔

        private int m_Alpha; // 입자의 알파값 계산.
        private double m_CurrentTime; 

        private ISprite m_Sprite;

        private ParticleType m_Type;

        public Particle(Vector2 pos, Color color, double existTime, Vector2 size, Vector2 direction, double velocity , ParticleType type)
        {
            m_CurrentPos = pos;
            m_Color = color;
            m_ExistTime = existTime;
            m_Velocity = velocity;
            m_Dir = direction;
            m_Size = size;

            m_CurrentTime = 0;
            m_Alpha = 0;

            m_Type = type;
        }
            
        public ParticleType GetParticleType()
        {
            return m_Type;
        }

        public void SetSprite(ISprite sprite)
        {
            m_Sprite = sprite;
        }

        public Color GetColor()
        {
            return new Color(m_Color.R - m_Alpha, m_Color.G - m_Alpha, m_Color.B - m_Alpha, m_Color.A - m_Alpha);
        }

        public bool Update(GameTime gameTime) //Alpha값이 0가 되면 return false 존재하는 시간이 지났다.
        {
            if (m_Alpha >= 255) return false; // 사라지면된다.

            m_CurrentPos.X += (float)(m_Dir.X * m_Velocity * gameTime.ElapsedGameTime.TotalSeconds);
            m_CurrentPos.Y += (float)(m_Dir.Y * m_Velocity * gameTime.ElapsedGameTime.TotalSeconds);

            m_CurrentTime += gameTime.ElapsedGameTime.TotalSeconds;
            m_Alpha = (int)(m_CurrentTime / m_ExistTime * 255);
            if (m_Alpha > 255)
                m_Alpha = 255;

            return true;
        }

        public void Draw(SpriteBatch sb)
        {
            m_Sprite.Draw(sb , new EntityInfo(m_CurrentPos , m_Size) );
        }
    }
}
